package com.zjsru.oneDay202211;

/**
 * @Author: CookLee
 * @Date: 2022/11/13
 * 自定义字符串排序
 * 对 s 的字符进行置换，使其与排序的 order 相匹配。更具体地说，如果在 order 中的字符 x 出现字符 y 之前，那么在排列后的字符串中， x 也应该出现在 y 之前。
 *
 * 输入: order = "cba", s = "abcd"
 * 输出: "cbad"
 * 解释:
 * “a”、“b”、“c”是按顺序出现的，所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。
 * 因为“d”不是按顺序出现的，所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。
 *
 */
public class CustomSortString {
    
    /**
     * 构造
     */
    private final char CHAR_A = 'a';
    
    private final int TWENTY_SIX = 26;
    
    public String customSortString(String order, String s) {
        int[] ints = new int[26];
        for (char c : s.toCharArray()) {
            ints[c - CHAR_A]++;
        }
        StringBuilder sb = new StringBuilder();
        //order中的字母和S中的字母对比，只有order中存在的会被添加
        for (char c : order.toCharArray()) {
            while (ints[c - CHAR_A]-- > 0) {
                sb.append(c);
            }
        }
        //答案后面再继续s字符串的追加字母
        for (int i = 0; i < TWENTY_SIX; i++) {
            while (ints[i]-- > 0) {
                sb.append((char) (i + CHAR_A));
            }
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
        CustomSortString customSortString = new CustomSortString();
        String order = "cba";
        String s = "abcd";
        System.out.println(customSortString.customSortString(order, s));
    }
}
